home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / BEGINC.LZH / M_SOLVE.C < prev    next >
C/C++ Source or Header  |  1985-05-17  |  4KB  |  42 lines

  1. static char *sccsid = "@(#)m_solve.c    4/16/82 (U of Maryland, FLB)";
  2.  
  3. #include "mat.h"
  4.  
  5. struct matrix *
  6. m_solve(a, b)
  7. register struct matrix *a, *b;
  8. {
  9. register struct matrix *a_trans, *t, *t_inv, *t2, *x;
  10.  
  11. if ((a->m_rows) < (a->m_cols)) {
  12.     printf("m_solve: too few equations\n");
  13.     return(M_NULL);
  14.     }
  15.  
  16. if ((a->m_rows) != (b->m_rows)) {
  17.     printf("m_solve: arguments don't match: %d, %d.\n", a->m_rows, b->m_rows);
  18.     return(M_NULL);
  19.     }
  20.  
  21. if (b->m_cols != 1) {
  22.     printf("m_solve: arg2 must have 1 column.\n");
  23.     return(M_NULL);
  24.     }
  25.  
  26. a_trans = m_transpose(a);        /* A' */
  27. t = m_multiply(a_trans, a);        /* A' A */
  28. t_inv = m_invert(t);            /* (A' A)-1 */
  29. free(t);
  30. if (t_inv == M_NULL) {
  31.     printf("m_solve: no solution\n");
  32.     return(M_NULL);
  33.     }
  34. t2 = m_multiply(t_inv, a_trans);    /* (A' A)-1 A' */
  35. free(t_inv);
  36. free(a_trans);
  37. x = m_multiply(t2, b);            /* (A' A)-1 A' B */
  38. free(t2);
  39.  
  40. return(x);
  41. }